//
// Created by wopy on 2020/9/1.
//
#include "Input.hpp"
#include "InputState.hpp"

INPUT_RETURN_VALUE doInput(void *arg, FcitxKeySym sym, unsigned int keyState) {
    InputState *state = (InputState *) arg;
    FcitxInputState *input = state->getFcitxInputState();
    char *strCodeInput = FcitxInputStateGetRawInputBuffer(input);
    INPUT_RETURN_VALUE retVal;

    retVal = IRV_TO_PROCESS;
    if (FcitxHotkeyIsHotKeyDigit(sym, keyState)) {    //按下数字键
        retVal = IRV_TO_PROCESS;    //让fcitx自行处理
    } else if (FcitxHotkeyIsHotKey(sym, keyState, FCITX_BACKSPACE)) {    //按下退格键
        //输入缓冲区中没有数据
        if (!FcitxInputStateGetRawInputBufferSize(input)) {    //缓冲区内没有数据
            if (!FcitxCandidateWordGetListSize(FcitxInputStateGetCandidateList(input)))
                return IRV_DONOT_PROCESS_CLEAN;    //候选词表中没有数据,删除一个已输入的字符
            return IRV_CLEAN;    //清空候选词表
        }
        //将输入缓冲区的长度减一
        FcitxInputStateSetRawInputBufferSize(input, FcitxInputStateGetRawInputBufferSize(input) - 1);
        //将输入缓冲区的最后一个字符置零
        strCodeInput[FcitxInputStateGetRawInputBufferSize(input)] = '\0';

        if (!FcitxInputStateGetRawInputBufferSize(input))
            retVal = IRV_CLEAN;    //没有数据,关闭候选词框
        else {
            retVal = IRV_DISPLAY_CANDWORDS;    //还有数据,更新候选词表
        }
    } else if (FcitxHotkeyIsHotKey(sym, keyState, FCITX_SPACE)) {
        //按下空格键
        if (!FcitxCandidateWordGetListSize(FcitxInputStateGetCandidateList(input)))
            return IRV_TO_PROCESS;    //候选词表中没有数据,输出空格
        retVal = FcitxCandidateWordChooseByIndex(FcitxInputStateGetCandidateList(input), 0); //输出候选词表中第一个词
    } else if (FcitxHotkeyIsHotKeyLAZ(sym, keyState)) {
        //按下字母键(小写)
        if (isKeyCode(sym)) {    //是输入键
            strCodeInput[FcitxInputStateGetRawInputBufferSize(input)] = sym;    //将键值插入缓冲区末尾
            FcitxInputStateSetRawInputBufferSize(input, FcitxInputStateGetRawInputBufferSize(input) + 1);    //将缓冲区长度加一
            strCodeInput[FcitxInputStateGetRawInputBufferSize(input)] = '\0';    //将缓冲区末尾置零
            retVal = IRV_DISPLAY_CANDWORDS;    //更新候选词表
        } else if (FcitxInputStateGetRawInputBufferSize(input)) {
            retVal = IRV_DO_NOTHING;    //什么都不做
        }
    } else if (FcitxHotkeyIsHotKey(sym, keyState, FCITX_ESCAPE)) {  //按下空格键
        FcitxCandidateWordList *canList = FcitxInputStateGetCandidateList(input);
        if (FcitxInputStateGetRawInputBufferSize(input)) {    //缓冲区内还有数据
            strCodeInput[0] = 0;    //将缓冲区第一个字符置零
            FcitxInputStateSetRawInputBufferSize(input, 0);    //将缓冲区长度置零
        }
        if (FcitxCandidateWordGetListSize(canList)) { //候选词表中还有数据
            FcitxCandidateWordReset(FcitxInputStateGetCandidateList(input));    //清空候选词表
        }
        return IRV_CLEAN;
    } else {    //按下其它键
        return IRV_TO_PROCESS;
    }
    return retVal;
}

boolean isKeyCode(char c) {
    switch (c) {
        case 'i':
        case 'o':
        case 'p':
        case 'k':
        case 'l':
        case 'm':
            return true;
    }
    return false;
}
